import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/***
 * filter：根据条件过滤数据；
 * map：将一个流中的值转换成另一个流；
 * limit：获取指定数量的数据；
 * sorted：对流中的元素进行排序；
 * distinct：根据流中元素的hashCode和equals去重；
 * forEach：遍历流中的每一个数据；
 * collect：将流转换为其他形式，接收一个Collector接口的实现，用于给Stream中元素做汇总的方法；
 * min/max：获取流中的最大/最小值；
 * count：获取流中元素的个数；
 * anyMatch：是否存在满足条件的元素；
 * allMatch：流中元素是否都满足条件；
 * noneMatch：流中元素是否都不满足条件。
 */
public class Demo {
    private static List<Integer> numberList = new ArrayList<Integer>();
    private static List<Integer> numberList2 = new ArrayList<>();
    static{
        numberList.add(1);
        numberList.add(9);
        numberList.add(3);
    }
    static {
        numberList2.add(1);
        numberList2.add(9);
        numberList2.add(3);
        numberList2.add(5);
        numberList2.add(5);
    }
    public static void filterDemo(){
        List<Integer> resultList = numberList.stream().filter(x -> x > 2).collect(Collectors.toList());
        System.out.println(resultList);
    }
    public static void mapDemo(){
        List<Integer> resultList = numberList.stream().map(x -> Integer.valueOf(x) + 1).collect(Collectors.toList());
        System.out.println(resultList);
    }
    public static void limitDemo(){
        List<Integer> resultList = numberList.stream().limit(2).collect(Collectors.toList());
        System.out.println(resultList);
    }

    public static void sortDemo(){
        List<Integer> resultList = numberList.stream().sorted().collect(Collectors.toList());
        System.out.println(resultList);
    }

    public static void distinctDemo(){
        List<Integer> resultList = numberList2.stream().distinct().collect(Collectors.toList());
        System.out.println(resultList);
    }

    public static void collectDemo(){
        Map<Integer,Integer> resultMap = numberList.stream().collect(Collectors.toMap(Integer::intValue,x -> x));
        System.out.println(resultMap);
        Map<Integer,List<Integer>> integerListMap = numberList.stream().collect(Collectors.groupingBy(x -> x));
        System.out.println(integerListMap);
        Set<Integer> resultSet = numberList.stream().collect(Collectors.toSet());
        System.out.println(resultSet);
    }

    public static void maxOrMinDemo(){
        System.out.println("max:" + numberList.stream().max(Integer::compare).get() + "," + numberList.stream().min(Integer::compare).get());
//        System.out.println(numberList.stream().min(Integer::compare).get());
    }

    public static void countDemo(){
        System.out.println(
                numberList.stream().count()
        );
    }

    public static void matchDemo(){
        System.out.println(numberList.stream().anyMatch(x -> x > 10));
        System.out.println(numberList.stream().allMatch(x -> x > 10));
        System.out.println(numberList.stream().noneMatch(x -> x > 10));
    }

    public static void main(String[] args) {
        //filter测试
        System.out.println("filter测试:");
        filterDemo();
        System.out.println("--------------------");
        //map测试
        System.out.println("map测试:");
        mapDemo();
        System.out.println("----------------------");
        System.out.println("limit测试:");
        limitDemo();
        System.out.println("----------------------");
        System.out.println("sort测试:");
        sortDemo();
        System.out.println("----------------------");
        System.out.println("distinct测试:");
        distinctDemo();
        System.out.println("----------------------");
        System.out.println("distinct测试:");
        collectDemo();
        System.out.println("----------------------");
        System.out.println("distinct测试:");
        maxOrMinDemo();
        System.out.println("----------------------");
        System.out.println("distinct测试:");
        countDemo();
        System.out.println("----------------------");
        System.out.println("match测试:");
        matchDemo();
        System.out.println("----------------------");
    }
}
